import com.briup.config.SpringConfig;
import com.briup.service.UserService;
import com.briup.web.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.time.LocalDateTime;
import java.util.Date;

public class Main {

    public static void main(String[] args) {
        // 创建SpringIOC容器，根据配置文件的方式创建；
        // 1. 加载配置文件，配置文件在类加载路径上，并且配置文件格式为xml
        // test();
        // 2. 使用注解的方式创建SpringIOC容器，并指定配置类或扫描的包
        // test2();
        // 3. 使用注解+配置类的方式创建SpringIOC容器
        test3();
    }

    private static void test3() {
        // 3. 使用注解+配置类的方式创建SpringIOC容器
        AnnotationConfigApplicationContext acactx =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        UserController bean = acactx.getBean(UserController.class);
        System.out.println(bean);

        LocalDateTime bean1 = acactx.getBean(LocalDateTime.class);
        System.out.println(bean1);
        Date bean2 = acactx.getBean(Date.class);
        System.out.println(bean2);
    }

    private static void test2() {
        AnnotationConfigApplicationContext acactx =
                new AnnotationConfigApplicationContext("com.briup");
        UserController bean = acactx.getBean(UserController.class);
        System.out.println(bean);
        UserService bean1 = acactx.getBean(UserService.class);
        System.out.println(bean1);
        // 注解方式相对于配置文件创建IOC容器的优势：
        // 1. 注解方式更加简洁，不需要配置文件
        // 2. 注解方式更加灵活，能够根据需要动态创建Bean实例
        // 3. 注解方式能够与其他Spring组件（如AOP、事务等）无缝集成
        // 缺点：1. 注解方式需要在类上标注注解，而配置文件方式则不需要，那么对于非自定义的类，
        // 就不能使用注解方式来创建Bean实例了
        Date bean2 = acactx.getBean(Date.class);
        System.out.println(bean2);
    }

    private static void test() {
        // 1. 加载配置文件，配置文件在类加载路径上，并且配置文件格式为xml
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "bean.xml");

        // 2. 根据id从IOC容器中获取Bean实例
        UserService userService = (UserService) ctx.getBean("userService");
        System.out.println(userService);
        // 3. 调用Bean实例的方法
        userService.login("admin", "123456");

        // 2. 重复获取Bean实例，验证是否为同一个实例
        UserService userService2 = (UserService) ctx.getBean("userService");
        System.out.println(userService2);
        UserService userService3 = (UserService) ctx.getBean("userService");
        System.out.println(userService3);

        // 获取UserController bean实例
        UserController userController = ctx.getBean("userController", UserController.class);
        userController.getUserInfo(1);
        System.out.println(userController);
    }
}
